home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Info-Mac 3
/
Info_Mac_1994-01.iso
/
Text Processing
/
Change Charset
/
ChangeCharSet.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-15
|
8KB
|
418 lines
#include <SetupA4.h>
#include "ExternalInterface.h"
#include "DialogUtilities.h"
#define MAC2ISO 2
#define MAC2SCAND 3
#define ISO2MAC 10
#define SCAND2MAC 11
#define INPLACE 4
#define NEWWIN 5
#define CLIPB 6
#define CANCEL 9
#define CONVERT 1
static void Convert2Scand(Handle text, long start, long end, long offset);
static void Convert2ISO(Handle text, long start, long end, long offset);
static void ConvertISO2Mac(Handle text, long start, long end, long offset);
static void ConvertScand2Mac(Handle text, long start, long end, long offset);
static struct _charsetoptions
{
enum {Mac2ISO, Mac2Scand, ISO2Mac, Scand2Mac} conversion;
enum {inPlace, newWin, clipBoard} destination;
} charsetOptions;
static Boolean nonEmptySelection;
void maintainButtons(DialogPtr d)
{
SetDlgCtl(d, MAC2ISO, charsetOptions.conversion == Mac2ISO);
SetDlgCtl(d, MAC2SCAND, charsetOptions.conversion == Mac2Scand);
SetDlgCtl(d, ISO2MAC, charsetOptions.conversion == ISO2Mac);
SetDlgCtl(d, SCAND2MAC, charsetOptions.conversion == Scand2Mac);
SetDlgCtl(d, INPLACE, charsetOptions.destination == inPlace);
SetDlgCtl(d, NEWWIN, charsetOptions.destination == newWin);
SetDlgCtl(d, CLIPB, charsetOptions.destination == clipBoard);
}
pascal void main(ExternalCallbackBlock *callbacks, WindowPtr w)
{
DialogPtr d;
short item;
GrafPtr save_port;
long selStart, selEnd, firstChar;
short act_len;
OSErr err;
RememberA0();
SetUpA4();
callbacks->GetPreference('CCST', sizeof(struct _charsetoptions), &charsetOptions, &act_len);
if (act_len < 0)
{
charsetOptions.conversion = Mac2ISO;
charsetOptions.destination = inPlace;
}
GetPort(&save_port);
d = callbacks->CenterDialog(128);
SetPort(d);
callbacks->GetSelection(&selStart, &selEnd, &firstChar);
nonEmptySelection = (selEnd > selStart);
do
{
maintainButtons(d);
ModalDialog(callbacks->StandardFilter, &item);
switch (item)
{
case MAC2ISO:
charsetOptions.conversion = Mac2ISO;
break;
case MAC2SCAND:
charsetOptions.conversion = Mac2Scand;
break;
case ISO2MAC:
charsetOptions.conversion = ISO2Mac;
break;
case SCAND2MAC:
charsetOptions.conversion = Scand2Mac;
break;
case INPLACE:
charsetOptions.destination = inPlace;
break;
case NEWWIN:
charsetOptions.destination = newWin;
break;
case CLIPB:
charsetOptions.destination = clipBoard;
break;
}
} while ((item != CONVERT) && (item != CANCEL));
DisposDialog(d);
SetPort(save_port);
if (item == CONVERT)
{
Handle h, text;
long textLen;
long changeStart, changeEnd;
long offset;
long extendLengthBy;
WindowPtr wp;
callbacks->SetPreference('CCST', sizeof(struct _charsetoptions), &charsetOptions, &act_len);
h = callbacks->GetWindowContents(w);
textLen = GetHandleSize(h);
if (!nonEmptySelection)
{
changeStart = 0;
changeEnd = textLen;
}
else
{
changeStart = selStart;
changeEnd = selEnd;
}
if (charsetOptions.destination == clipBoard || charsetOptions.destination == newWin) {
text = callbacks->Allocate(changeEnd-changeStart, FALSE);
if (text == NULL) {
callbacks->ReportOSError(memFullErr);
goto done;
}
BlockMove(*h + changeStart, *text, changeEnd-changeStart);
offset = 0;
} else {
text = h;
offset = changeStart;
}
switch (charsetOptions.conversion) {
case Mac2ISO:
Convert2ISO(text, changeStart, changeEnd, offset);
break;
case Mac2Scand:
Convert2Scand(text, changeStart, changeEnd, offset);
break;
case ISO2Mac:
ConvertISO2Mac(text, changeStart, changeEnd, offset);
break;
case Scand2Mac:
ConvertScand2Mac(text, changeStart, changeEnd, offset);
break;
}
if (charsetOptions.destination == inPlace) {
callbacks->ContentsChanged(w);
callbacks->SetSelection(selStart, selEnd, firstChar);
} else if (charsetOptions.destination == newWin) {
wp = callbacks->NewDocument();
callbacks->SetWindowContents(wp, text);
callbacks->SetSelection(selStart, selEnd, firstChar);
/* text-handle belongs to the new window, don't dispose */
} else {
HLock(text);
ZeroScrap();
PutScrap(changeEnd - changeStart, 'TEXT', *text);
DisposHandle(text); /* obsolete, free it */
}
}
done:
RestoreA4();
}
static void Convert2ISO(Handle text, long start, long end, long offset)
{
long len = end - start;
long i;
char *p = *text + offset;
for (i = 0; i < len; i++)
switch (p[i]) {
case '\307':
p[i] = '\253';
break;
case '\310':
p[i] = '\273';
case '\246':
p[i] = '\266';
break;
case '\244':
p[i] = '\247';
break;
case '\347':
p[i] = '\301';
break;
case '\207':
p[i] = '\341';
break;
case '\200':
p[i] = '\304';
break;
case '\212':
p[i] = '\344';
break;
case '\313':
p[i] = '\300';
break;
case '\210':
p[i] = '\340';
break;
case '\256':
p[i] = '\306';
break;
case '\276':
p[i] = '\346';
break;
case '\201':
p[i] = '\305';
break;
case '\214':
p[i] = '\345';
break;
case '\203':
p[i] = '\311';
break;
case '\216':
p[i] = '\351';
break;
case '\205':
p[i] = '\326';
break;
case '\232':
p[i] = '\366';
break;
case '\257':
p[i] = '\330';
break;
case '\277':
p[i] = '\370';
break;
case '\206':
p[i] = '\334';
break;
case '\237':
p[i] = '\374';
break;
default:
break;
}
}
static void ConvertISO2Mac(Handle text, long start, long end, long offset)
{
long len = end - start;
long i;
char *p = *text + offset;
for (i = 0; i < len; i++)
switch (p[i]) {
case '\253':
p[i] = '\307';
break;
case '\273':
p[i] = '\310';
case '\266':
p[i] = '\246';
break;
case '\247':
p[i] = '\244';
break;
case '\301':
p[i] = '\347';
break;
case '\341':
p[i] = '\207';
break;
case '\304':
p[i] = '\200';
break;
case '\344':
p[i] = '\212';
break;
case '\300':
p[i] = '\313';
break;
case '\340':
p[i] = '\210';
break;
case '\306':
p[i] = '\256';
break;
case '\346':
p[i] = '\276';
break;
case '\305':
p[i] = '\201';
break;
case '\345':
p[i] = '\214';
break;
case '\311':
p[i] = '\203';
break;
case '\351':
p[i] = '\216';
break;
case '\326':
p[i] = '\205';
break;
case '\366':
p[i] = '\232';
break;
case '\330':
p[i] = '\257';
break;
case '\370':
p[i] = '\277';
break;
case '\334':
p[i] = '\206';
break;
case '\374':
p[i] = '\237';
break;
default:
break;
}
}
static void Convert2Scand(Handle text, long start, long end, long offset)
{
long len = end - start;
long i;
char *p = *text + offset;
for (i = 0; i < len; i++)
switch (p[i]) {
case '\200':
p[i] = '[';
break;
case '\212':
p[i] = '{';
break;
case '\201':
p[i] = ']';
break;
case '\214':
p[i] = '}';
break;
case '\203':
p[i] = '@';
break;
case '\216':
p[i] = '`';
break;
case '\205':
p[i] = '\\';
break;
case '\232':
p[i] = '|';
break;
case '\334':
p[i] = '^';
break;
case '\374':
p[i] = '~';
break;
default:
break;
}
}
static void ConvertScand2Mac(Handle text, long start, long end, long offset)
{
long len = end - start;
long i;
char *p = *text + offset;
for (i = 0; i < len; i++)
switch (p[i]) {
case '[':
p[i] = '\200';
break;
case '{':
p[i] = '\212';
break;
case ']':
p[i] = '\201';
break;
case '}':
p[i] = '\214';
break;
case '@':
p[i] = '\203';
break;
case '`':
p[i] = '\216';
break;
case '\\':
p[i] = '\205';
break;
case '|':
p[i] = '\232';
break;
case '^':
p[i] = '\334';
break;
case '~':
p[i] = '\374';
break;
default:
break;
}
}